///**
// *
// */
//package com.example.office.util;
//
//import java.io.BufferedInputStream;
//import java.io.BufferedReader;
//import java.io.DataOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.net.HttpURLConnection;
//import java.net.MalformedURLException;
//import java.net.URL;
//import java.nio.charset.Charset;
//import java.security.KeyManagementException;
//import java.security.NoSuchAlgorithmException;
//import java.security.SecureRandom;
//import java.security.cert.CertificateException;
//import java.security.cert.X509Certificate;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.Map;
//import java.util.Map.Entry;
//import java.util.Set;
//
//import javax.net.ssl.HostnameVerifier;
//import javax.net.ssl.HttpsURLConnection;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.SSLContext;
//import javax.net.ssl.SSLSession;
//import javax.net.ssl.SSLSocketFactory;
//import javax.net.ssl.TrustManager;
//import javax.net.ssl.X509TrustManager;
//import javax.xml.parsers.DocumentBuilder;
//import javax.xml.parsers.DocumentBuilderFactory;
//import javax.xml.parsers.ParserConfigurationException;
//
//import org.apache.commons.beanutils.BeanMap;
//import org.apache.http.HttpEntity;
//import org.apache.http.HttpResponse;
//import org.apache.http.HttpStatus;
//import org.apache.http.client.HttpClient;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.entity.ContentType;
//import org.apache.http.entity.mime.HttpMultipartMode;
//import org.apache.http.entity.mime.MultipartEntityBuilder;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.util.EntityUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//import org.springframework.web.multipart.MultipartFile;
//import org.w3c.dom.Document;
//import org.w3c.dom.NamedNodeMap;
//import org.w3c.dom.Node;
//import org.w3c.dom.NodeList;
//import org.xml.sax.EntityResolver;
//import org.xml.sax.InputSource;
//import org.xml.sax.SAXException;
//
//import com.rls.portals.common.Const;
//import com.rls.portals.dao.ISelectDao;
//import com.rls.portals.dao.entity.common.CategoryAttrEntity;
//import com.rls.portals.model.pojo.common.Attachment;
//
///**
// * @author yaohuixing
// * 远程API调用工具类
// */
//public class RemoteUtil {
//
//	private static Map<String,String> URL_MAP;
//	//private static Logger logger = Logger.getLogger(RemoteUtil.class);
//	private static Logger logger=LoggerFactory.getLogger(RemoteUtil.class);
//	/**Web接口跟路径地址*/
//	private static String WEBAPI_ROOT = null;
//	private static ISelectDao selectDao;
//
//	public void setSelectDao(ISelectDao sltDao) {
//		selectDao = sltDao;
//	}
//
//	static{
//		DocumentBuilderFactory docBuilderFac = DocumentBuilderFactory.newInstance();
//		DocumentBuilder docBuilder;
//		try {
//			docBuilder = docBuilderFac.newDocumentBuilder();
//			docBuilder.setEntityResolver(new EntityResolver(){
//                public InputSource resolveEntity(String publicId,String sytemId)
//                        throws SAXException, IOException {
//                   String dtdFile = getFileName(true);
//                   return new InputSource(dtdFile.toString());
//                }
//            });
//			Document doc = docBuilder.parse(getFileName(false));
//			doParse(doc);
//		} catch (ParserConfigurationException e) {
//			logger.error("remote-api.xml解析失败", e.getCause());
//		} catch (SAXException e) {
//			logger.error("remote-api.xml解析失败", e.getCause());
//		} catch (IOException e) {
//			logger.error("remote-api.xml解析失败", e.getCause());
//		}
//	}
//
//	/**
//	 * @param flag
//	 * @return 返回 remote-config下的文件全名
//	 */
//	private static String getFileName(boolean flag){
//		StringBuffer fileName = new StringBuffer();
//		fileName.append(RemoteUtil.class.getResource("/").getPath());
//		fileName.append("remote-config");
//		fileName.append(System.getProperty("file.separator"));
//        if (flag) {
//        	fileName.append("remote-api.dtd");
//        } else {
//        	fileName.append("remote-api.xml");
//        }
//        return fileName.toString();
//	}
//
//	/**
//	 * 解析remote-api.xml
//	 * @param doc
//	 */
//	private static void doParse(Document doc) {
//		URL_MAP = new HashMap<String,String>();
//		NodeList apiList = doc.getElementsByTagName("request");
//        for (int i=0; i < apiList.getLength(); i++){
//            Node request =  apiList.item(i);
//            NamedNodeMap attr = request.getAttributes();
//            Node keyNode = attr.getNamedItem("id");
//            Node valueNode = attr.getNamedItem("url");
//            URL_MAP.put(keyNode.getNodeValue().trim(), valueNode.getNodeValue().trim());
//        }
//	}
//
//	/**
//	 * 以POST方式调用远程服务<br/>
//	 * 失败返回空串
//	 * @param apiId  远程APIID 参见remote-api.xml
//	 * @param requestParam 请求参数
//	 * @return JSON格式字符串
//	 */
//	public static String post(String apiId,Map<String,String> requestParam){
//		try {
//			return submit(apiId, requestParam, "POST");
//		} catch (MalformedURLException e) {
//			logger.error(e.getMessage(), e.getCause());
//			return "";
//		}
//	}
//
//	/**
//	 * 以GET方式访问远程服务<br/>
//	 * 失败返回空串
//	 * @param apiId 远程APIID 参见remote-api.xml
//	 * @param requestParam 请求参数
//	 * @return JSON格式字符串
//	 */
//	public static String get(String apiId,Map<String, String> requestParam){
//		try {
//			return submit(apiId, requestParam, "GET");
//		} catch (MalformedURLException e) {
//			logger.error(e.getMessage(), e.getCause());
//			return "";
//		}
//	}
//
//	public static String uploadFile(MultipartFile uploadFile,Attachment attachment) throws Exception{
//		if (StringUtils.isEmpty(WEBAPI_ROOT)) {
//			WEBAPI_ROOT = loadAPIRoot();
//		}
//		StringBuffer buffer = new StringBuffer();
//		buffer.append(WEBAPI_ROOT);
//		buffer.append(URL_MAP.get("uploadfile"));
//		String requestURL = buffer.toString();
//		HttpPost httpPost = new HttpPost(requestURL);
//		MultipartEntityBuilder multipartFactory = MultipartEntityBuilder.create();
//		multipartFactory.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//		multipartFactory.setCharset(Charset.forName("UTF-8"));
//		if(attachment != null){
//			BeanMap beanMap = new BeanMap(attachment);
//			for(Object key: beanMap.keySet()){
//				if(key != null){
//					Object value = beanMap.get(key);
//					if(value != null){
//						multipartFactory.addTextBody(key.toString(), beanMap.get(key).toString());
//					}
//				}
//			}
//		}
//		if(uploadFile != null){
//			multipartFactory.addBinaryBody("filedata", uploadFile.getBytes()
//					,ContentType.DEFAULT_BINARY,uploadFile.getOriginalFilename());
//		}
//		HttpEntity httpEntity = multipartFactory.build();
//		httpPost.setEntity(httpEntity);
//		HttpClient httpclient = HttpClients.createDefault();
//		HttpResponse resp =  httpclient.execute(httpPost);
//		StringBuffer respBf = new StringBuffer();
//		if(resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//			HttpEntity respEntity = resp.getEntity();
//			if(respEntity != null){
//				InputStream is = respEntity.getContent();
//				InputStreamReader isReader = new InputStreamReader(is);
//				BufferedReader bfReader = new BufferedReader(isReader);
//				try{
//					String s;
//	                while (((s = bfReader.readLine()) != null)) {
//	                	respBf.append(s);
//
//	                }
//				}finally{
//				     if(is != null){
//	                     is.close();
//	                 }
//					EntityUtils.consume(respEntity);
//				}
//			}
//		}
//		return respBf.toString();
//	}
//
//	/**
//	 * 接收远程API返回的文件输入流
//	 * @param apiId APIID remote-api.xml
//	 * @param requestParam API参数
//	 * @return bis 文件输入流
//	 * @throws IOException
//	 */
//	public static BufferedInputStream receiveStream(String apiId,Map<String, String> requestParam) throws IOException {
//		if (StringUtils.isEmpty(WEBAPI_ROOT)) {
//			WEBAPI_ROOT = loadAPIRoot();
//		}
//		StringBuffer buffer = new StringBuffer();
//		buffer.append(WEBAPI_ROOT);
//		buffer.append(URL_MAP.get(apiId));
//		String requestStr = buffer.toString();
//		URL url = null;
//		String parameterString = null;
//		if (CollectionUtils.isEmpty(requestParam)) {
//			parameterString = "";
//		} else {
//			parameterString = createQueryParam(requestParam);
//		}
//		if (!StringUtils.isEmpty(parameterString)) {
//			StringBuffer sBuffer = new StringBuffer(requestStr);
//			sBuffer.append("?");
//			sBuffer.append(parameterString);
//			url = new URL(sBuffer.toString());
//		} else {
//			url = new URL(requestStr);
//		}
//		BufferedInputStream bis = null;
//		if (StringUtils.startsWithIgnoreCase(requestStr, Const.PROTOCOL_HTTPS)){
//			//https
//			TrustManager[] tm = {new RemoteTrustManager()};
//			SSLContext sslContext;
//			try {
//				sslContext = SSLContext.getInstance("SSL");
//				sslContext.init(new KeyManager[0],  tm, new SecureRandom());
//				SSLSocketFactory ssf = sslContext.getSocketFactory();
//				HttpsURLConnection httpsConn = (HttpsURLConnection)url.openConnection();
//				httpsConn.setSSLSocketFactory(ssf);
//				httpsConn.setHostnameVerifier(new RemoteHostnameVerifier());
//				httpsConn.setRequestMethod("GET");
//				httpsConn.connect();
//				bis = new BufferedInputStream (httpsConn.getInputStream());
//			} catch (NoSuchAlgorithmException e) {
//				logger.error(e.getMessage(), e);
//				throw new IOException(e.getMessage());
//			} catch (KeyManagementException e) {
//				logger.error(e.getMessage(), e);
//				throw new IOException(e.getMessage());
//			}
//
//		} else {
//			//http
//			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//			conn.connect();
//			bis = new BufferedInputStream (conn.getInputStream());
//		}
//		return bis;
//
//	}
//
//	/**
//	 * 访问远程API返回JSON格式字符串<br/>
//	 * 失败返回空串
//	 * @param apiId 远程APIID 参见remote-api.xml
//	 * @param requestParam 请求参数
//	 * @param method 请求类型
//	 * @return jsonStr JSON格式字符串
//	 * @throws MalformedURLException
//	 */
//	private static String submit(String apiId,Map<String,String> requestParam,String method)
//			throws MalformedURLException {
//
//		if (StringUtils.isEmpty(WEBAPI_ROOT)) {
//			WEBAPI_ROOT = loadAPIRoot();
//		}
//		String jsonStr = "";
//		StringBuffer buffer = new StringBuffer();
//		buffer.append(WEBAPI_ROOT);
//		buffer.append(URL_MAP.get(apiId));
//		String requestStr = buffer.toString();
//		if(StringUtils.isEmpty(requestStr)) {
//			return jsonStr;
//		}
//
//		URL url = null;
//		String parameterString = null;
//		requestParam.put("operationSrc", "0");//注册标识PC端为0
//		if (CollectionUtils.isEmpty(requestParam)) {
//			parameterString = "";
//		} else {
//			parameterString = createQueryParam(requestParam);
//		}
//		if ("POST".equalsIgnoreCase(method) ) {
//			url = new URL(requestStr);
//		} else {
//
//			if (!StringUtils.isEmpty(parameterString)) {
//				StringBuffer sBuffer = new StringBuffer(requestStr);
//				sBuffer.append("?");
//				sBuffer.append(parameterString);
//				url = new URL(sBuffer.toString());
//			} else {
//				url = new URL(requestStr);
//			}
//
//		}
//		logger.debug("链接后台api---start：请求路径:{},请求方法:{},请求参数:{}", url, method,parameterString);
//		// 判断协议类型 http?https?
//		if (StringUtils.startsWithIgnoreCase(requestStr, Const.PROTOCOL_HTTPS)) {
//			jsonStr = doHttps(url, parameterString, method);
//		} else {
//			jsonStr = doHttp(url,parameterString,method);
//		}
//		logger.debug("链接后台api---end：api返回结果:{}", jsonStr);
//		return jsonStr;
//	}
//
//	/**
//	 * 取API地址
//	 * 开发阶段返回公网接口地址
//	 * */
//	private static String loadAPIRoot() {
//
//
//		CategoryAttrEntity condition = new CategoryAttrEntity();
//		condition.setCategoryCd(Const.SYSTME_CONFIG);
//		condition.setConfiged(Const.IS_CONFIGED);
//		condition.setState(Const.ATTR_STATE_ENABLED);
//		condition.setCurrentDate(new Date(System.currentTimeMillis()));
//		condition.setAttrCd(Const.WEB_INTERFACE_KEY);
//		CategoryAttrEntity result =
//				selectDao.selectForObject("site.loadAttrValue", condition, CategoryAttrEntity.class);
//		return result.getActualval();
//		// 开发阶段返回公网接口地址
////		return "http://192.168.33.140:8080/fortunet-api/";
//	}
//
//	/**
//	 * 以HTTPS方式访问远程远程API
//	 * @param url 请求地址
//	 * @param parameterString 参数字符串（key=value)
//	 * @param method 请求方法
//	 * @return
//	 */
//	private static String doHttps(URL url,String parameterString,String method) {
//		TrustManager[] tm = {new RemoteTrustManager()};
//		String jsonStr = "";
//		try {
//			SSLContext sslContext = SSLContext.getInstance("SSL");
//			sslContext.init(new KeyManager[0],  tm, new SecureRandom());
//			SSLSocketFactory ssf = sslContext.getSocketFactory();
//			HttpsURLConnection httpsConn = (HttpsURLConnection)url.openConnection();
//			httpsConn.setSSLSocketFactory(ssf);
//			httpsConn.setHostnameVerifier(new RemoteHostnameVerifier());
//			httpsConn.setRequestMethod(method);
//			jsonStr = doConnection(httpsConn,parameterString,method);
//		} catch (NoSuchAlgorithmException e) {
//			logger.error(e.getMessage(), e.getCause());
//		} catch (KeyManagementException e) {
//			logger.error(e.getMessage(), e.getCause());
//		} catch (MalformedURLException e) {
//			logger.error(e.getMessage(), e.getCause());
//		} catch (IOException e) {
//			logger.error(e.getMessage(), e.getCause());
//		}
//		return jsonStr;
//	}
//
//	/**
//	 * 以HTTP方式访问远程远程API
//	 * @param url 请求地址
//	 * @param parameterString 参数字符串（key=value)
//	 * @param method 请求方法
//	 * @return
//	 */
//	private static String doHttp(URL url,String parameterString,String method) {
//		String jsonStr = "";
//		InputStream is = null;
//		HttpURLConnection conn = null;
//		try {
//			conn = (HttpURLConnection)url.openConnection();
//			conn.setRequestMethod(method);
//			jsonStr = doConnection(conn,parameterString,method);
//		} catch (MalformedURLException e) {
//			logger.error(e.getMessage(), e.getCause());
//		} catch (IOException e) {
//			logger.error(e.getMessage(), e.getCause());
//		} finally {
//			if (is!=null) {
//				try {
//					is.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//			if (conn != null) {
//				conn.disconnect();
//			}
//		}
//		return jsonStr;
//	}
//
//
//	/**
//	 * 执行连接
//	 * @param conn
//	 * @param requestParam
//	 * @return
//	 */
//	private static String doConnection(HttpURLConnection conn,String parameterString,String method) {
//		// 绑定请求参数
//		InputStream is = null;
//		DataOutputStream dos = null;
//		String jsonStr = "";
//		try {
//			conn.setDoInput(true);
//			conn.setUseCaches(false);
//			if ("POST".equalsIgnoreCase(method)) {
//				conn.setDoOutput(true);
//				conn.setInstanceFollowRedirects(false);
//				conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
//				conn.setRequestProperty("Accept-Charset", "utf-8");
//				dos = new DataOutputStream(conn.getOutputStream());
//				byte[] paramBytes = parameterString.getBytes("utf-8");
//				dos.write(paramBytes);
//				dos.flush();
//			}
//		    conn.connect();
//			int responseCode = conn.getResponseCode();
//			if (responseCode == 200) {
//				is = conn.getInputStream();
//				BufferedReader br =  new BufferedReader(new InputStreamReader(is, "UTF-8"));
//				String data = null;
//				StringBuffer dataBuf = new StringBuffer();
//				while ((data = br.readLine())!=null) {
//					dataBuf.append(new String(data));
//				}
//				jsonStr = dataBuf.toString();
//				if (logger.isDebugEnabled()) {
//					logger.debug("remote json result:" + jsonStr);
//				}
//			} else {
//				jsonStr = "{\"status\":"+responseCode+"}";
//				logger.error("remote url error. response code:" + responseCode);
//				logger.error("url:" + conn.getURL().getPath());
//				logger.error("method:" + conn.getRequestMethod());
//				logger.error("request parameter:" + parameterString);
//			}
//			conn.disconnect();
//		} catch (IOException e) {
//			e.printStackTrace();
//			logger.error("",e);
//		} finally {
//			if (is != null) {
//				try {
//					is.close();
//				} catch (IOException e) {
//					logger.error(e.getMessage(), e.getCause());
//				}
//			}
//			if (dos!=null) {
//				try{
//					dos.close();
//				} catch(IOException e) {
//					logger.error(e.getMessage(), e.getCause());
//				}
//			}
//		}
//		return jsonStr;
//	}
//
//	/**
//	 * 创建API访问参数
//	 * @param requestParam 参数KEY
//	 * @return
//	 */
//	private static String createQueryParam(Map<String,String> requestParam) {
//		StringBuffer param = new StringBuffer();
//		Set<Entry<String,String>> set = requestParam.entrySet();
//		Iterator<Entry<String,String>> it = set.iterator();
//		while(it.hasNext()) {
//			Entry<String,String> entry = it.next();
//			param.append(entry.getKey());
//			param.append("=");
//			param.append(entry.getValue());
//			if (it.hasNext()) {
//				param.append("&");
//			}
//		}
//		return param.toString();
//	}
//
//	private static class RemoteTrustManager implements TrustManager,X509TrustManager {
//
//		@Override
//		public void checkClientTrusted(X509Certificate[] arg0, String arg1)
//				throws CertificateException {
//		}
//
//		@Override
//		public void checkServerTrusted(X509Certificate[] arg0, String arg1)
//				throws CertificateException {
//		}
//
//		@Override
//		public X509Certificate[] getAcceptedIssuers() {
//			return new X509Certificate[]{};
//		}
//	}
//
//	private static class RemoteHostnameVerifier implements HostnameVerifier {
//		@Override
//        public boolean verify(String hostname, SSLSession session) {
//            return true;
//        }
//    }
//
//}
